home *** CD-ROM | disk | FTP | other *** search
/ Internet Info 1994 March / Internet Info CD-ROM (Walnut Creek) (March 1994).iso / networking / news / readers / nn / nn6.4.patch4 < prev    next >
Encoding:
Text File  |  1990-05-29  |  54.6 KB  |  2,365 lines

  1.          This is an official patch to nn release 6.4
  2.          -------------------------------------------
  3.  
  4.                    PATCH #4
  5.  
  6.                 Priority: HIGH
  7.  
  8.  
  9. These patches fix more bugs in the 6.4 release.  It fixes a nasty bug
  10. causing lines to be dropped from .newsrc if it contained an "aliased"
  11. group (fourth field is =group in Cnews's active file).
  12.  
  13. All changes are described in the updated RELEASE_NOTES file (read that
  14. for details about this patch).  Thanks to all who reported bugs and
  15. provided fixes.
  16.  
  17. To apply this patch, use nn's :patch command, or run this command from
  18. the shell in the root of the nn source tree:
  19.     patch -p0 < this-article
  20.  
  21.  
  22. ++Kim Storm
  23.  
  24. *** ./LAST/admin.c    Tue May 22 12:53:33 1990
  25. --- admin.c    Mon May 28 23:19:55 1990
  26. ***************
  27. *** 776,781 ****
  28. --- 776,782 ----
  29.   group_header *gh;
  30.   {
  31.       char command[FILENAME*2];
  32. +     char *rmprog;
  33.   
  34.       if (!file_exist(news_active, "w")) {
  35.       printf("Not privileged to run rmgroup\n");
  36. ***************
  37. *** 782,788 ****
  38.       return;
  39.       }
  40.   
  41. !     sprintf(command, "%s/rmgroup %s", news_lib_directory, gh->group_name);
  42.       system(command);
  43.       any_key(0);
  44.       gh->master_flag &= ~M_VALID;        /* just for nnadmin */
  45. --- 783,803 ----
  46.       return;
  47.       }
  48.   
  49. ! #ifdef RMGROUP_PATH
  50. !     rmprog = RMGROUP_PATH;
  51. ! #else
  52. !     rmprog = "rmgroup";
  53. ! #endif
  54. !     if (*rmprog != '/') rmprog = relative(news_lib_directory, rmprog);
  55. !     if (file_exist(rmprog, "x")) goto rm_ok;
  56. ! #ifndef RMGROUP_PATH
  57. !     rmprog = relative(news_lib_directory, "delgroup");
  58. !     if (file_exist(rmprog, "x")) goto rm_ok;
  59. ! #endif
  60. !     printf("Program %s not found\n", rmprog);
  61. !     return;
  62. !  rm_ok:
  63. !     sprintf(command, "%s %s", rmprog, gh->group_name);
  64.       system(command);
  65.       any_key(0);
  66.       gh->master_flag &= ~M_VALID;        /* just for nnadmin */
  67. ***************
  68. *** 845,851 ****
  69.           break;
  70.   
  71.        case 'R':
  72. !         if (admin_confirm("Recolletion of Group", 0))
  73.           send_master(SM_RECOLLECT, gh, SP, 0L);
  74.           break;
  75.   
  76. --- 860,866 ----
  77.           break;
  78.   
  79.        case 'R':
  80. !         if (admin_confirm("Recollection of Group", 0))
  81.           send_master(SM_RECOLLECT, gh, SP, 0L);
  82.           break;
  83.   
  84. *** ./LAST/answer.c    Tue May 22 12:53:34 1990
  85. --- answer.c    Mon May 28 23:17:29 1990
  86. ***************
  87. *** 228,233 ****
  88. --- 228,234 ----
  89.   {
  90.       FILE *param;
  91.       char *args[10], *fn;
  92. +     char route[512], *poster;
  93.       register char **ap = args;
  94.       import int novice;
  95.       import char *pager;
  96. ***************
  97. *** 238,244 ****
  98.       param = open_file(relative(nn_directory, ".param"), OPEN_CREATE);
  99.       if (param == NULL) {
  100.       strcpy(delayed_msg, "cannot create .param file for aux script");
  101. !     return 0;
  102.       }
  103.   
  104.       if (strcmp(prog, "cancel") == 0) {
  105. --- 239,245 ----
  106.       param = open_file(relative(nn_directory, ".param"), OPEN_CREATE);
  107.       if (param == NULL) {
  108.       strcpy(delayed_msg, "cannot create .param file for aux script");
  109. !     return 1;
  110.       }
  111.   
  112.       if (strcmp(prog, "cancel") == 0) {
  113. ***************
  114. *** 278,288 ****
  115.           aux_param_str(param, "*A", fn != NULL ? fn : "");
  116.       }
  117.   
  118. !     /*
  119. !     aux_param_str(param, "", );
  120. !     aux_param_bool(param, "", );
  121. !     aux_param_int(param, "", );
  122. !     */
  123.       }
  124.   
  125.       fclose(param);
  126. --- 279,293 ----
  127.           aux_param_str(param, "*A", fn != NULL ? fn : "");
  128.       }
  129.   
  130. !     poster = NULL;
  131. !     if (ah != NULL && strcmp(prog, "follow") == 0) {
  132. !         poster = news.ng_reply != NULL ? news.ng_reply : news.ng_from;
  133. !         if (poster && reroute(route, poster)) 
  134. !         poster = route;
  135. !         else
  136. !         poster = NULL;
  137. !     }
  138. !     aux_param_str(param, "POSTER_ADR", poster);
  139.       }
  140.   
  141.       fclose(param);
  142. ***************
  143. *** 327,332 ****
  144. --- 332,338 ----
  145.       int edit_message, append_sig;
  146.       char *str, *script;
  147.       news_header_buffer nhbuf, dhbuf;
  148. +     flag_type st_flag = 0;
  149.   
  150.       first_action = "edit";
  151.       edit_message = 1;
  152. ***************
  153. *** 380,386 ****
  154.       pgm = "reply";
  155.       append_sig = append_sig_mail;
  156.   
  157. !     ah->flag |= A_ST_REPLY;
  158.   
  159.       if (reply_to(t, news.ng_reply) ||
  160.           reply_to(t, news.ng_from) ||
  161. --- 386,392 ----
  162.       pgm = "reply";
  163.       append_sig = append_sig_mail;
  164.   
  165. !     st_flag = A_ST_REPLY;
  166.   
  167.       if (reply_to(t, news.ng_reply) ||
  168.           reply_to(t, news.ng_from) ||
  169. ***************
  170. *** 426,432 ****
  171.       script = news_script;
  172.       append_sig = append_sig_post;
  173.   
  174. !     ah->flag |= A_ST_FOLLOW;
  175.   
  176.   #ifdef NNTP
  177.   #ifdef NNTP_MINI_INEWS_HEADER
  178. --- 432,438 ----
  179.       script = news_script;
  180.       append_sig = append_sig_post;
  181.   
  182. !     st_flag = A_ST_FOLLOW;
  183.   
  184.   #ifdef NNTP
  185.   #ifdef NNTP_MINI_INEWS_HEADER
  186. ***************
  187. *** 562,570 ****
  188.       fclose(t);
  189.       if (art) fclose(art);
  190.   
  191. !     aux_sh(ah, script, pgm, first_action, record_file,
  192. !        command == K_FOLLOW_UP ? "Article%s posted" : "Mail%s sent",
  193. !        append_sig);
  194.   
  195.       return edit_message;
  196.   
  197. --- 568,577 ----
  198.       fclose(t);
  199.       if (art) fclose(art);
  200.   
  201. !     if (aux_sh(ah, script, pgm, first_action, record_file,
  202. !            command == K_FOLLOW_UP ? "Article%s posted" : "Mail%s sent",
  203. !            append_sig) == 0)
  204. !     if (ah) ah->flag |= st_flag;
  205.   
  206.       return edit_message;
  207.   
  208. *** ./LAST/aux.sh    Tue May 22 12:53:35 1990
  209. --- aux.sh    Mon May 28 19:23:53 1990
  210. ***************
  211. *** 33,40 ****
  212.   
  213.   # first we handle 'cancel'
  214.   
  215. ! if [ "$OPERATION" = "cancel" ] ; then
  216.     $INEWS -h  << EOF > /tmp/nn$$c 2>&1
  217.   Newsgroups: $GROUP
  218.   Subject: cancel $ART_ID
  219. --- 33,40 ----
  220.   
  221.   # first we handle 'cancel'
  222.   
  223. ! case "$OPERATION" in
  224. ! cancel)
  225.     $INEWS -h  << EOF > /tmp/nn$$c 2>&1
  226.   Newsgroups: $GROUP
  227.   Subject: cancel $ART_ID
  228. ***************
  229. *** 50,57 ****
  230.     esac
  231.     rm -f /tmp/nn$$c
  232.     exit $x
  233. ! fi
  234.   
  235.   TRACE=${WORK}T
  236.   FINAL=${WORK}F
  237. --- 50,65 ----
  238.     esac
  239.     rm -f /tmp/nn$$c
  240.     exit $x
  241. !   ;;
  242. ! post|follow)
  243. !   LOOKFOR="Newsgroups:"
  244. !   SEND="post article"
  245. !   ;;
  246. ! *)
  247. !   LOOKFOR="To:"
  248. !   SEND="send letter"
  249. !   ;;
  250. ! esac
  251.   
  252.   TRACE=${WORK}T
  253.   FINAL=${WORK}F
  254. ***************
  255. *** 66,79 ****
  256.   
  257.   loop=true
  258.   prompt=false
  259. ! pr="Action: a)bort e)dit"
  260. ! if [ -n "$(SPELL_CHECKER)" ] ; then
  261. !   pr="$pr i)spell"
  262.   fi
  263. ! pr="$pr r)eedit s)end v)iew w)rite: "
  264. ! if [ -n "${DFLT_ANSW}" ] ; then
  265. !   pr="$pr (${DFLT_ANSW}) "
  266.   fi
  267.   
  268.   while $loop ; do
  269.     if [ -n "${FIRST_ACTION}" ] ; then
  270. --- 74,96 ----
  271.   
  272.   loop=true
  273.   prompt=false
  274. ! pr="a)bort"
  275. ! if [ -n "${POSTER_ADR}" ] ; then
  276. !   pr="$pr c)c"
  277.   fi
  278. ! pr="$pr e)dit"
  279. ! if [ -n "${SPELL_CHECKER}" ] ; then
  280. !   pr="$pr i)spell"
  281.   fi
  282. + pr="$pr m)ail r)eedit s)end v)iew w)rite"
  283. + case "${DFLT_ANSW}" in
  284. +   p*|s*) pr1=" (${SEND})"
  285. +       ;;
  286. +   "") pr1=""
  287. +       ;;
  288. +   *)  pr1=" (${DFLT_ANSW})"
  289. +       ;;
  290. + esac
  291.   
  292.   while $loop ; do
  293.     if [ -n "${FIRST_ACTION}" ] ; then
  294. ***************
  295. *** 81,87 ****
  296.       FIRST_ACTION=""
  297.     elif $prompt ; then
  298.       echo ''
  299. !     ${AWK} 'END{printf "'"${pr}"'"}' < /dev/null
  300.       read act
  301.       if [ -z "$act" ] ; then
  302.         act="${DFLT_ANSW}"
  303. --- 98,105 ----
  304.       FIRST_ACTION=""
  305.     elif $prompt ; then
  306.       echo ''
  307. !     echo "${pr}"
  308. !     ${AWK} 'END{printf "Action:'"${pr1}"' "}' < /dev/null
  309.       read act
  310.       if [ -z "$act" ] ; then
  311.         act="${DFLT_ANSW}"
  312. ***************
  313. *** 89,95 ****
  314.     fi
  315.     prompt=true
  316.   
  317. !   case $act in
  318.     a*)
  319.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  320.       read act
  321. --- 107,113 ----
  322.     fi
  323.     prompt=true
  324.   
  325. !   case "$act" in
  326.     a*)
  327.       ${AWK} 'END{printf "Confirm abort: (y) "}' < /dev/null
  328.       read act
  329. ***************
  330. *** 98,103 ****
  331. --- 116,137 ----
  332.            exit 22 ;;
  333.       esac
  334.       ;;
  335. +   c*)
  336. +     if [ -n "${POSTER_ADR}" ] ; then
  337. +       ${AWK} 'END{printf "CC: '"${POSTER_ADR}"' (y) "}' </dev/null
  338. +       read act
  339. +       case "$act" in
  340. +       ""|"y*")
  341. +     echo "Sending copy to poster...."
  342. +     CC="${POSTER_ADR}"
  343. +     ;;
  344. +       esac
  345. +     else
  346. +       echo "Not doing follow-up"
  347. +     fi
  348. +     ;;
  349.     e*)
  350.       # call editor to enter at line $ED_LINE of work file
  351.   
  352. ***************
  353. *** 132,137 ****
  354. --- 166,179 ----
  355.           exit 22
  356.         fi
  357.       fi
  358. +     if [ -n "${LOOKFOR}" ] ; then
  359. +       if grep "^${LOOKFOR}" $WORK > /dev/null ; then
  360. +     :
  361. +       else
  362. +     echo "Warning: no $LOOKFOR line in article"
  363. +       fi
  364. +     fi
  365.       ;;
  366.   
  367.     i*)
  368. ***************
  369. *** 142,147 ****
  370. --- 184,206 ----
  371.       fi
  372.       ;;
  373.   
  374. +   m*)
  375. +     ${AWK} 'END{printf "To: "}' </dev/null
  376. +     read CC
  377. +     if [ -n "${CC}" ] ; then
  378. +       echo "Sending copy...."
  379. +     fi
  380. +     ;;
  381. +   n*)
  382. +     act="abort"
  383. +     prompt=false
  384. +     ;;
  385. +   p*)
  386. +     loop=false
  387. +     ;;
  388.     r*)
  389.       ${AWK} 'END{printf "Edit original file: (y) "}' < /dev/null
  390.       read act
  391. ***************
  392. *** 167,176 ****
  393. --- 226,257 ----
  394.       fi
  395.       ;;
  396.   
  397. +   y*)
  398. +     act="${DFLT_ANSW}"
  399. +     prompt=false
  400. +     ;;
  401.     ENV)
  402.       set
  403.       ;;
  404.     esac
  405. +   if [ -n "${CC}" ] ; then
  406. +     echo "To: ${CC}" > $FINAL
  407. +     sed -e "s/^To:/X-To:/" -e "/^Orig-To:/d" $WORK >> $FINAL
  408. +     if ${MAILER_PIPE} ; then
  409. +       $MAILER < $FINAL
  410. +       x=$?
  411. +     else
  412. +       $MAILER $FINAL
  413. +       x=$?
  414. +     fi
  415. +     case $x in
  416. +       0) echo Done ;;
  417. +       *) echo $MAILER failed ;;
  418. +     esac
  419. +     CC=""
  420. +   fi
  421.   done
  422.   
  423.   if [ ${APPEND_SIG} = "true" -a -f $HOME/.signature ] ; then
  424. ***************
  425. *** 182,188 ****
  426.     fi
  427.     case $ans in
  428.     ''|y*|Y*)
  429. !     echo "--" >> $WORK
  430.       cat $HOME/.signature >> $WORK
  431.       ;;
  432.     esac
  433. --- 263,269 ----
  434.     fi
  435.     case $ans in
  436.     ''|y*|Y*)
  437. !     echo "-- " >> $WORK
  438.       cat $HOME/.signature >> $WORK
  439.       ;;
  440.     esac
  441. ***************
  442. *** 242,252 ****
  443.         ;;
  444.   
  445.       follow|post)
  446. !       $INEWS -h < $FINAL
  447. !       case $? in
  448. !     0) sleep 60 ;;
  449. !     *) echo $INEWS failed ;;
  450. !       esac
  451.         ;;
  452.   
  453.       *)
  454. --- 323,335 ----
  455.         ;;
  456.   
  457.       follow|post)
  458. !       {
  459. !     $INEWS -h < $FINAL
  460. !     case $? in
  461. !       0) sleep 60 ;;
  462. !       *) echo $INEWS failed ;;
  463. !     esac
  464. !       } | fgrep -v "mailing your article to" 
  465.         ;;
  466.   
  467.       *)
  468. *** ./LAST/conf/s-sys5.h    Thu Apr 26 19:56:03 1990
  469. --- conf/s-sys5.h    Fri May 25 23:56:21 1990
  470. ***************
  471. *** 62,73 ****
  472.   #define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  473.   
  474.   /*
  475. -  *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  476. -  */
  477. - #define MICRO_ALARM()    alarm(1)    /* System V */
  478. - /*
  479.    *    Define if your system has BSD like job control (SIGTSTP works)
  480.    */
  481.   
  482. --- 62,67 ----
  483. *** ./LAST/conf/s-template.h    Wed May  2 09:38:37 1990
  484. --- conf/s-template.h    Fri May 25 18:26:11 1990
  485. ***************
  486. *** 71,80 ****
  487.   #define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  488.   
  489.   /*
  490.    *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  491.    */
  492.   
  493. - #define MICRO_ALARM()    alarm(1)    /* System V */
  494.   /*#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  495.   
  496.   /*
  497. --- 71,91 ----
  498.   #define    RESET_SIGNAL_WHEN_CAUGHT    /* */
  499.   
  500.   /*
  501. +  *    Define FAKE_INTERRUPT if a keyboard interrupt (^C) cannot interrupt
  502. +  *    a read() system call.  This happens on a few BSD based systems
  503. +  *    which don't have SV_INTERRUPT defined in <signal.h> and no
  504. +  *    siginterrupt() call to make systems call interruptable.  
  505. +  *    However, if siginterrupt() is available, but SV_INTERRUPT isn't
  506. +  *    defined, then simply define that instead of FAKE_INTERRUPT!
  507. +  */
  508. + /* #define FAKE_INTERRUPT    /* */
  509. + /*
  510.    *    Define MICRO_ALARM to timeout in 0.1 seconds if possible
  511. +  *    It is not used on systems with the TERMIO interface (sys V).
  512.    */
  513.   
  514.   /*#define MICRO_ALARM()    ualarm(100000,0)    /* BSD 4.3 */
  515.   
  516.   /*
  517. ***************
  518. *** 112,117 ****
  519. --- 123,134 ----
  520.   
  521.   #define    HAVE_MKDIR            /* */
  522.   
  523. + /*
  524. +  *    Define NO_RENAME if the rename() system call is not available.
  525. +  *    Notice: rename() is only used by the NNTP code.
  526. +  */
  527. + /* #define NO_RENAME            /* */
  528.   
  529.   /*
  530.    *    Pick one:
  531. *** ./LAST/config.h-dist    Wed May 16 11:23:35 1990
  532. --- config.h-dist    Mon May 28 19:24:06 1990
  533. ***************
  534. *** 194,203 ****
  535.    *    spool directory.  To use this scheme, the OWNER specified above
  536.    *    must have write permission on the news spool directories.
  537.    *
  538. !  *    You should also be careful not to specify a database directory
  539. !  *    if you access news via NNTP - you may not have the proper directories
  540. !  *    on your local system.  However, it is probably ok anyway if nnmaster
  541. !  *    runs on the nntp server.
  542.    *
  543.    *    To change the default behaviour, you can define the following
  544.    *    symbols:
  545. --- 194,204 ----
  546.    *    spool directory.  To use this scheme, the OWNER specified above
  547.    *    must have write permission on the news spool directories.
  548.    *
  549. !  *    If you access news via NNTP, you will probably always have to
  550. !  *    give the database directory explicitly through DB_DIRECTORY
  551. !  *    (and DB_DATA_DIRECTORY), since the normal news spool directories 
  552. !  *    are probably not available on the local system.
  553. !  *    The exception may be if nnmaster runs directly on the nntp server.
  554.    *
  555.    *    To change the default behaviour, you can define the following
  556.    *    symbols:
  557. ***************
  558. *** 229,234 ****
  559. --- 230,238 ----
  560.    *
  561.    *    INEWS_PATH        - The location of the inews program.
  562.    *                  Default: NEWS_LIB_DIR/inews
  563. +  *
  564. +  *    RMGROUP_PATH        - The location of the rmgroup program.
  565. +  *                  Default: NEWS_LIB_DIR/{rm,del}group
  566.    */
  567.   
  568.   #define NEWS_DIRECTORY        "/usr/spool/news"    /* */
  569. *** ./LAST/doc/NNTP    Sat May  5 14:11:44 1990
  570. --- doc/NNTP    Mon May 28 23:35:25 1990
  571. ***************
  572. *** 132,137 ****
  573. --- 132,147 ----
  574.       if both are defined.  If neither is defined, it will be
  575.       installed in /usr/lib/news/inews.
  576.   
  577. + EXCELAN
  578. +     You can define this symbol if your tcp/ip is based on the
  579. +     EXCELAN implementation (no netdb.h, no getservbyname(), no
  580. +     gethostbyname()).  (This belongs in the s- file!)
  581. + NO_BZERO
  582. + NO_RENAME
  583. +     You can define these symbols if your system doesn't provide
  584. +     the bzero() and/or rename() functions (these #define:s belong
  585. +     in the s- file).
  586.       
  587.           
  588.                   TUNING
  589. *** ./LAST/doc/RELEASE_NOTES    Tue May 22 12:53:37 1990
  590. --- doc/RELEASE_NOTES    Mon May 28 23:07:14 1990
  591. ***************
  592. *** 547,553 ****
  593. --- 547,690 ----
  594.       In the command, ":? [space] pwd [return]" which prints the working
  595.       directory correctly, but then repaints the screen immediately.
  596.   
  597. + Prog:    nnadmin
  598. + Title:    "rmgroup" is Bnews specific - Cnews has "delgroup"
  599. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  600. + Fixed:    Patch #4 [admin.c config.h-dist   -- new RMGROUP_PATH define]
  601.   
  602. +     Cnews has no `rmgroup' but instead a `delgroup' in its `newsbin'
  603. +     directory. The entire path including the program name should be
  604. +     configurable (in config.h).
  605. + Prog:    nnmaster - manual
  606. + Title:    nnmaster is in man8, but identifies itself as nnmaster(1M)
  607. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  608. + Fixed:    Patch #4 [nnmaster.8]
  609. + Prog:    nnmaster
  610. + Title:    Files created by nnmaster are not in group GROUP
  611. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  612. + Fixed:    Patch #4 [inst.sh -- nnmaster also runs setgid GROUP]
  613. + Prog:    nnadmin
  614. + Title:    Typo in "Recolle(c)tion ..." prompt
  615. + From:    Jim Clausing <jac@brahms.tinton.ccur.com> + fix
  616. + Fixed:    Patch #4 [admin.c]
  617. + Prog:    nn
  618. + Title:    Missing external declaration of nntp_get_filename in group.c
  619. + From:    hans@duttnph.tudelft.nl (Hans Buurman)
  620. + Fixed:    Patch #4 [group.c]
  621. + Prog:    nn
  622. + Title:    Interpretation of "marked-by-read-skip" is reversed
  623. + From:    dean%coplex@relay.EU.net (Dean Brooks) + fix
  624. + Fixed:    Patch #4 [menu.c]
  625. + Prog:    nn
  626. + Title:    re-layout 2 shows "base" articles as "0>".
  627. + From:    syd@dsinc.dsi.com (Syd Weinstein)
  628. + Fixed:    Patch #4 [menu.c]
  629. + Prog:    nn
  630. + Title:    .newsrc corruption -- lines are lost
  631. + From:    jeremy@cs.swarthmore.edu (Jeremy Brest)
  632. + From:    fitz@wang.com (Tom Fitzgerald) + explanation!
  633. + Fixed:    Patch #4 [newsrc.c]
  634. +     Groups aliased in the active file and appearing in .newsrc would
  635. +     cause parts of it to be lost!
  636. + Prog:    nn, nnacct
  637. + Title:    nn does not compile if only AUTHORIZE is defined.
  638. + From:    eps@toaster.SFSU.EDU (Eric P. Scott)
  639. + Fixed:    Patch #4 [nn.c]
  640. + Prog:    nn
  641. + Title:    SP/CR/X/.... cannot skip to next group when "nn -x" is used.
  642. + From:    jbayer@ispi.UUCP (Jonathan Bayer)
  643. + Fixed:    Patch #4 [menu.c]
  644. + Prog:    inst
  645. + Title:    It is not checked that nnmaster is actually killed by ./inst m
  646. + From:    Jaap Vermeulen <jaap%sequent@relay.EU.net> + fix
  647. +     deborah@Sun.COM (Deborah Bennett)
  648. + Fixed:    Patch #4 [inst.sh]
  649. + Prog:    various
  650. + Title:    Not all y/n prompts are flushed
  651. + From:    Jaap Vermeulen <jaap%sequent@relay.EU.net>
  652. + Fixed:    Patch #4 [term.c]
  653. + Prog:    nntp support
  654. + Title:    nntp module uses rename() which is not generally available.
  655. + From:    Tim Oldham <tjo@its.bt.co.uk>
  656. + Fixed:    Patch #4 [nntp.c s-template.h  -- #define NO_RENAME in s- file]
  657. + Prog:    nn / nnpost
  658. + Title:    Should check that a Newsgroups: line exists before posting
  659. + From:    olson%anchor.esd@sgi.com (Dave Olson)
  660. + Fixed:    Patch #4 [aux.sh]
  661. +     If one accidentally deletes the newsgroup line from a followup, and
  662. +     then posts the article, it gets posted anyway.  In our case, it got
  663. +     posted to 'general', which is the only group with no '.' in it.
  664. + Prog:    nnmaster
  665. + Title:    nnmaster doesn't complete installation if duplicates in active.
  666. + From:    Ric Steinberger <RIC@RML2.SRI.COM>
  667. + Fixed:    Patch #4 [master.c]
  668. +     No error is reported, and no instructions are given if initialization
  669. +     is stopped by confirming to fix duplicated entries in active file.
  670. + Prog:    nn -g
  671. + Title:    Error message shown if unknown group is entered is cleared instantly.
  672. + From:    Uwe Doering <gemini@geminix.mbx.sub.org>
  673. +     Nick Holloway <alfie@cs.warwick.ac.uk>
  674. + Fixed:    Patch #4 [nn.c -- added 2s delay]
  675. + Prog:    nn
  676. + Title:    nncheck does not respect "newsrc" setting in init file.
  677. + From:    cjsa!jeff (Jeffery Small)
  678. + Fixed:    Patch #4 [nn.c]
  679. + Prog:    nn
  680. + Title:    The X command in reading mode doesn't mark selected articles read.
  681. + From:    dannie%coplex@relay.EU.net (Dannie Gregoire)
  682. + Fixed:    Patch #4 [menu.c]
  683. +     
  684. + Prog:    nnmaster
  685. + Title:    nnmaster says "master already running" but this is not true....
  686. + From:    Bob Halloran <rkh@mtune.dptg.att.com>
  687. +     Dean Brooks <dean@coplex.UUCP> [$MASTER is write protected!]
  688. + Fixed:    Patch #4 [proto.c -- will halt with fatal error]
  689. + Prog:    nn
  690. + Title:    The --(Filed,Re,Follow)-- labels are set even if the action fails.
  691. + From:    leo@aai.com
  692. + Fixed:    Patch #4 [answer.c save.c]
  693. + Prog:    nn
  694. + Title:    confirm-append does not work with $N
  695. + From:    leo@aai.com
  696. +     
  697. + Prog:    nn
  698. + Title:    previous (group) command doesn't include read articles on the menu.
  699. + From:    netmgr@VENUS.CSC.FI
  700. +     The current behaviour isn't logical, and it is difficult to get into
  701. +     a state where articles marked read by mistake can be unmarked.
  702. + Prog:    nn
  703. + Title:    L and J commands should barf when used in no-update mode.
  704. + From:    netmgr@VENUS.CSC.FI
  705. + Prog:    nn
  706. + Title:    L and J commands should work *at least* when menu contains all art.
  707. + From:    netmgr@VENUS.CSC.FI
  708.   New features since initial 6.4.0 release
  709.   ----------------------------------------
  710.   
  711. ***************
  712. *** 596,598 ****
  713. --- 733,760 ----
  714.   Title:    New folder-save-file variable for saving from folders.
  715.   From:    KFS (to fix problem with default-save-file)
  716.   Fixed:    Patch #3 [save.c group.c variable.c nn.1]
  717. + Prog:    nn
  718. + Title:    New ignore-xon-xoff variable can be unset to make ^S/^Q useful
  719. + From:    KFS
  720. + Added:    Patch #4 [term.c variable.c nn.1]
  721. + Prog:    aux
  722. + Title:    New "c)c" command when posting followup to send copy to poster.
  723. + From:    KFS
  724. + Added:    Patch #4 [aux.sh answer.c nn.1]
  725. + Prog:    nn
  726. + Title:    New variable: show-purpose-mode
  727. + From:    KFS (on request from Rasmus Lerdorf)
  728. + Added:    Patch #4 [menu.c variable.c nn.1]
  729. + Prog:    nntp
  730. + Title:    Added support for EXCELAN
  731. + From:    fleming%nvuxk@bellcore.bellcore.com
  732. + Added:    Patch #4 [nntp.c NNTP]
  733. + Prog:    nn
  734. + Title:    New variable: read-return-next-page
  735. + From:    Jeffrey (J.D.) Sparkes <JSPARKES@BNR.CA>
  736. + Added:    Patch #4 [menu.c variable.c nn.1]
  737. *** ./LAST/folder.c    Tue May 22 12:53:38 1990
  738. --- folder.c    Mon May 28 23:35:24 1990
  739. ***************
  740. *** 14,19 ****
  741. --- 14,22 ----
  742.   export int  dont_sort_folders = 0;
  743.   export char *folder_directory  = NULL;
  744.   
  745. + import int fmt_linenum;
  746. + import char *header_lines;
  747.   /*
  748.    *     file name completion and expansion
  749.    *
  750. ***************
  751. *** 241,248 ****
  752.       return 1;    /* number of header lines */
  753.   }
  754.   
  755. ! folder_menu(path)
  756.   char *path;
  757.   {
  758.       FILE             *folder;
  759.       register article_header    *ah;
  760. --- 244,259 ----
  761.       return 1;    /* number of header lines */
  762.   }
  763.   
  764. ! /*
  765. !  *    mode values:
  766. !  *        0: normal folder or digest
  767. !  *        1: online manual
  768. !  *        2: mailbox
  769. !  */
  770. ! folder_menu(path, mode)
  771.   char *path;
  772. + int mode;
  773.   {
  774.       FILE             *folder;
  775.       register article_header    *ah;
  776. ***************
  777. *** 253,260 ****
  778. --- 264,276 ----
  779.       group_header         fake_group;
  780.       int                cc_save;
  781.       char folder_name[FILENAME], folder_file[FILENAME];
  782. +     int orig_layout;
  783. +     char *orig_hdr_lines;
  784.       extern time_stamp pack_date();
  785.   
  786. +     orig_layout = fmt_linenum;
  787. +     orig_hdr_lines = header_lines;
  788. +     
  789.       strcpy(folder_name, path);
  790.       fake_group.group_name = folder_name;
  791.       if (!expand_file_name(folder_file, folder_name, 1)) return ME_NO_REDRAW;
  792. ***************
  793. *** 303,308 ****
  794. --- 319,325 ----
  795.           ah->sender = alloc_str(length);
  796.           strcpy(ah->sender, buffer);
  797.           ah->name_length = length;
  798. +         if (mode == 1) fold_string(ah->sender);
  799.       } else {
  800.           ah->sender = "";
  801.           ah->name_length = 0;
  802. ***************
  803. *** 314,319 ****
  804. --- 331,337 ----
  805.           ah->subject = alloc_str(length);
  806.           strcpy(ah->subject, buffer);
  807.           ah->subj_length = length;
  808. +         if (mode == 1 && length > 1) fold_string(ah->subject + 1);
  809.       } else {
  810.           ah->replies = 0;
  811.           ah->subject = "";
  812. ***************
  813. *** 340,355 ****
  814.       if (n_articles > 1) {
  815.           clrdisp();
  816.           prompt_line = 2;
  817. !         if (!dont_sort_folders) sort_articles(-1);
  818.       }
  819.   
  820.       cc_save = cancel_count;
  821.       cancel_count = 0;
  822.   
  823.        reenter_menu:
  824.       menu_cmd = menu(folder_header);
  825.   
  826. !     if (cancel_count) {
  827.           clrdisp();
  828.           printf("Folder: %s\nFile:   %s\n\n", folder_name, folder_file);
  829.           if (cancel_count == n_articles)
  830. --- 358,377 ----
  831.       if (n_articles > 1) {
  832.           clrdisp();
  833.           prompt_line = 2;
  834. !         if (mode == 0 && !dont_sort_folders) sort_articles(-1);
  835.       }
  836.   
  837.       cc_save = cancel_count;
  838.       cancel_count = 0;
  839. +     if (mode == 1) {
  840. +         fmt_linenum = -1;
  841. +         header_lines = "*";
  842. +     }
  843.   
  844.        reenter_menu:
  845.       menu_cmd = menu(folder_header);
  846.   
  847. !     if (mode == 0 && cancel_count) {
  848.           clrdisp();
  849.           printf("Folder: %s\nFile:   %s\n\n", folder_name, folder_file);
  850.           if (cancel_count == n_articles)
  851. ***************
  852. *** 380,385 ****
  853. --- 402,411 ----
  854.       }
  855.   
  856.       release_memory(&mem_marker);
  857. +     if (fmt_linenum == -1) {
  858. +     fmt_linenum = orig_layout;
  859. +     header_lines = orig_hdr_lines;
  860. +     }
  861.   
  862.       return menu_cmd;
  863.   }
  864. *** ./LAST/global.c    Tue May 22 12:53:38 1990
  865. --- global.c    Tue May 22 16:06:42 1990
  866. ***************
  867. *** 75,80 ****
  868. --- 75,83 ----
  869.   export int s_keyboard        = 0;    /* keyboard interrupt */
  870.   export int s_pipe        = 0;    /* broken pipe */
  871.   export int s_redraw        = 0;    /* redraw signal (if job control) */
  872. + #ifdef RESIZING
  873. + export int s_resized        = 0;    /* screen resized */
  874. + #endif
  875.   
  876.   #ifdef FAKE_INTERRUPT
  877.   #include <setjmp.h>
  878. ***************
  879. *** 81,86 ****
  880. --- 84,90 ----
  881.   
  882.   export jmp_buf fake_keyb_sig;
  883.   export int arm_fake_keyb_sig = 0;
  884. + export char fake_keyb_siglist[NSIG];
  885.   #endif
  886.   
  887.   sig_type catch_hangup(n)
  888. ***************
  889. *** 88,93 ****
  890. --- 92,101 ----
  891.       signal(n, SIG_IGN);
  892.   
  893.       s_hangup++;
  894. + #ifdef FAKE_INTERRUPT
  895. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  896. +         longjmp(fake_keyb_sig, 1);
  897. + #endif
  898.   }
  899.   
  900.   static sig_type catch_keyboard(n)
  901. ***************
  902. *** 96,102 ****
  903.       signal(n, catch_keyboard);
  904.   #endif
  905.   #ifdef FAKE_INTERRUPT
  906. !     if (arm_fake_keyb_sig)
  907.       longjmp(fake_keyb_sig, 1);
  908.   #endif
  909.       s_keyboard++;
  910. --- 104,110 ----
  911.       signal(n, catch_keyboard);
  912.   #endif
  913.   #ifdef FAKE_INTERRUPT
  914. !     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  915.       longjmp(fake_keyb_sig, 1);
  916.   #endif
  917.       s_keyboard++;
  918. ***************
  919. *** 109,114 ****
  920. --- 117,126 ----
  921.   #ifdef RESET_SIGNAL_WHEN_CAUGHT
  922.       signal(n, catch_pipe);
  923.   #endif
  924. + #ifdef FAKE_INTERRUPT
  925. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  926. +         longjmp(fake_keyb_sig, 1);
  927. + #endif
  928.   }
  929.   
  930.   #ifdef HAVE_JOBCONTROL
  931. ***************
  932. *** 121,126 ****
  933. --- 133,147 ----
  934.   #endif
  935.   
  936.       suspend_nn();
  937. + #ifdef FAKE_INTERRUPT
  938. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig) {
  939. + #ifdef RESIZING
  940. +     s_resized++;
  941. + #endif
  942. +     longjmp(fake_keyb_sig, 1);
  943. +     }
  944. + #endif
  945.   }
  946.   #endif
  947.   
  948. ***************
  949. *** 130,135 ****
  950. --- 151,161 ----
  951.       unsigned short getuid(), getgid();
  952.       int getpid();
  953.       int suspend_nn();
  954. +     int i;
  955. + #ifdef FAKE_INTERRUPT
  956. +     for (i = 0; i < NSIG; i++) fake_keyb_siglist[i] = i == 2 ? 1 : 0;
  957. + #endif
  958.   
  959.       if (who_am_i != I_AM_NN) {
  960.       signal(SIGINT,  SIG_IGN);
  961. *** ./LAST/group.c    Tue May 22 12:53:39 1990
  962. --- group.c    Fri May 25 12:20:36 1990
  963. ***************
  964. *** 498,503 ****
  965. --- 498,504 ----
  966.           if ((ah->flag & A_DIGEST) == 0) {
  967.   #ifdef NNTP
  968.           if (use_nntp) {
  969. +             extern char *nntp_get_filename();
  970.               answer = nntp_get_filename(ah->a_number, current_group);
  971.               goto get_folder;
  972.           }
  973. ***************
  974. *** 705,711 ****
  975.       if (strcmp(answer, "+") == 0)
  976.       answer = (gh && gh->save_file != NULL) ? gh->save_file : 
  977.           (gh->group_flag & G_FOLDER) ? folder_save_file : default_save_file;
  978. !     menu_cmd = folder_menu(answer);
  979.       gh = NULL;
  980.       goto goto_exit;
  981.   
  982. --- 706,712 ----
  983.       if (strcmp(answer, "+") == 0)
  984.       answer = (gh && gh->save_file != NULL) ? gh->save_file : 
  985.           (gh->group_flag & G_FOLDER) ? folder_save_file : default_save_file;
  986. !     menu_cmd = folder_menu(answer, 0);
  987.       gh = NULL;
  988.       goto goto_exit;
  989.   
  990. *** ./LAST/init.c    Tue May 22 12:53:41 1990
  991. --- init.c    Fri May 25 12:20:35 1990
  992. ***************
  993. *** 978,985 ****
  994.       CASE( "man" ) {
  995.           char *manual;
  996.           group_header *orig_group;
  997. -         int orig_layout, orig_fsort;
  998. -         import int fmt_linenum, dont_sort_folders;
  999.   
  1000.           manual = relative(help_directory, "Manual");
  1001.           if (!file_exist(manual, "fr")) {
  1002. --- 978,983 ----
  1003. ***************
  1004. *** 990,1005 ****
  1005.           }
  1006.           }
  1007.           orig_group = current_group;
  1008. !         orig_layout = fmt_linenum;
  1009. !         orig_fsort = dont_sort_folders;
  1010. !         fmt_linenum = -1;
  1011. !         dont_sort_folders = 1;
  1012. !         folder_menu(manual);
  1013. !         fmt_linenum = orig_layout;
  1014. !         dont_sort_folders = orig_fsort;
  1015.           init_group(orig_group);
  1016.   
  1017.           return AC_REDRAW;
  1018. --- 988,994 ----
  1019.           }
  1020.           }
  1021.           orig_group = current_group;
  1022. !         folder_menu(manual, 1);
  1023.           init_group(orig_group);
  1024.   
  1025.           return AC_REDRAW;
  1026. ***************
  1027. *** 1105,1111 ****
  1028.           }
  1029.   
  1030.           orig_group = current_group;
  1031. !         folder_menu(mail_box);
  1032.           init_group(orig_group);
  1033.   
  1034.           return AC_REDRAW;
  1035. --- 1094,1100 ----
  1036.           }
  1037.   
  1038.           orig_group = current_group;
  1039. !         folder_menu(mail_box, 2);
  1040.           init_group(orig_group);
  1041.   
  1042.           return AC_REDRAW;
  1043. *** ./LAST/inst.sh    Wed May 16 11:23:38 1990
  1044. --- inst.sh    Sun May 27 17:34:53 1990
  1045. ***************
  1046. *** 14,21 ****
  1047.               exit 1
  1048.           fi
  1049.           chmod $3 $2
  1050. !         chgrp $GROUP $2
  1051. !         chown $OWNER $2
  1052.           echo Created directory $2
  1053.       fi
  1054.       exit 0
  1055. --- 14,23 ----
  1056.               exit 1
  1057.           fi
  1058.           chmod $3 $2
  1059. !         if ./usercheck 0 ; then
  1060. !             chgrp $GROUP $2
  1061. !             chown $OWNER $2
  1062. !         fi
  1063.           echo Created directory $2
  1064.       fi
  1065.       exit 0
  1066. ***************
  1067. *** 23,37 ****
  1068.   copy)
  1069.       cp $4 $3
  1070.       chmod $2 $3/$4
  1071. !     chgrp $GROUP $3/$4
  1072. !     chown $OWNER $3/$4
  1073.       echo "$4 -> $3/$4"
  1074.       exit 0
  1075.       ;;
  1076.   chmod)
  1077.       chmod $2 $3
  1078. !     chgrp $GROUP $3
  1079. !     chown $OWNER $3
  1080.       exit 0
  1081.       ;;
  1082.   
  1083. --- 25,43 ----
  1084.   copy)
  1085.       cp $4 $3
  1086.       chmod $2 $3/$4
  1087. !     if ./usercheck 0 ; then
  1088. !         chgrp $GROUP $3/$4
  1089. !         chown $OWNER $3/$4
  1090. !     fi
  1091.       echo "$4 -> $3/$4"
  1092.       exit 0
  1093.       ;;
  1094.   chmod)
  1095.       chmod $2 $3
  1096. !     if ./usercheck 0 ; then
  1097. !         chgrp $GROUP $3
  1098. !         chown $OWNER $3
  1099. !     fi
  1100.       exit 0
  1101.       ;;
  1102.   
  1103. ***************
  1104. *** 101,125 ****
  1105.   else
  1106.       PAUSE=true
  1107.   
  1108. ! echo
  1109. ! echo
  1110. ! echo "INSTALLATION"
  1111. ! echo ""
  1112. ! echo "1) Master programs (machine dependent)"
  1113. ! echo "2) User programs (machince dependent, shareable)"
  1114. ! echo "3) Help files and auxiliary programs (shareable)"
  1115. ! echo "4) Documentation (shareable)"
  1116. ! echo "5) Online manual (shareable with 3)"
  1117. ! echo ""
  1118. ! echo "INIT) Initialize database"
  1119. ! echo ""
  1120. ! echo "s) Server installation:  1 + 2 + 3 + 4 + 5"
  1121. ! echo "n) Network installation:     2 + 3 + 4 + 5"
  1122. ! echo "m) Master installation:  1"
  1123. ! echo "c) Client installation:      2"
  1124. ! echo "u) Update after patch"
  1125. ! echo "q) Quit"
  1126. ! echo ""
  1127.   if ./usercheck 0 ; then
  1128.       :
  1129.   else
  1130. --- 107,135 ----
  1131.   else
  1132.       PAUSE=true
  1133.   
  1134. ! cat <<'EOF'
  1135. ! INSTALLATION
  1136. ! 1) Master programs (machine dependent)
  1137. ! 2) User programs (machince dependent, shareable)
  1138. ! 3) auxiliary programs (configuration dependent, shareable)
  1139. ! 4) Documentation (shareable)
  1140. ! 5) Help files (shareable)
  1141. ! 6) Online manual (shareable with 5)
  1142. ! INIT) Initialize database
  1143. ! s) Server installation:  1 + 2 + 3 + 4 + 5 + 6
  1144. ! n) Network installation:     2 + 3 + 4 + 5 + 6
  1145. ! h) Shared installation:      2 + 3
  1146. ! m) Master installation:  1
  1147. ! c) Client installation:      2
  1148. ! u) Update after patch
  1149. ! q) Quit
  1150. ! EOF
  1151.   if ./usercheck 0 ; then
  1152.       :
  1153.   else
  1154. ***************
  1155. *** 151,156 ****
  1156. --- 161,170 ----
  1157.       then
  1158.           OPT="$OPT aux help"
  1159.       fi
  1160. +     if [ -d "$HELP" ]
  1161. +     then
  1162. +         OPT="$OPT help"
  1163. +     fi
  1164.       if [ -f "$DMAN_DIR/nnmaster.$DMAN_SECT" ]
  1165.       then
  1166.           OPT="$OPT man"
  1167. ***************
  1168. *** 169,187 ****
  1169.   2|c)
  1170.       OPT=bin
  1171.       ;;
  1172. - 3)
  1173. -     OPT="aux help"
  1174. -     ;;
  1175. - x)
  1176. -     OPT=aux
  1177. -     ;;
  1178.   h)
  1179. !     OPT=help
  1180.       ;;
  1181.   4)
  1182.       OPT="man"
  1183.       ;;
  1184.   5)
  1185.       OPT="online"
  1186.       ;;
  1187.   INIT)
  1188. --- 183,201 ----
  1189.   2|c)
  1190.       OPT=bin
  1191.       ;;
  1192.   h)
  1193. !     OPT="bin aux"
  1194. !     ;;
  1195. ! 3)
  1196. !     OPT="aux"
  1197.       ;;
  1198.   4)
  1199.       OPT="man"
  1200.       ;;
  1201.   5)
  1202. +     OPT="help"
  1203. +     ;;
  1204. + 6)
  1205.       OPT="online"
  1206.       ;;
  1207.   INIT)
  1208. ***************
  1209. *** 209,225 ****
  1210.   
  1211.       if [ -f $MASTER/nnmaster ]
  1212.       then
  1213. !         (
  1214. !         cd $MASTER
  1215. !         if [ -f MPID ]
  1216.           then
  1217.               echo "Stopping running master..."
  1218. !             kill -1 `cat MPID`
  1219. !             sleep 5
  1220. !             rm -f MPID
  1221.           fi
  1222. !         mv nnmaster nnmaster.old
  1223. !        )
  1224.       fi
  1225.   
  1226.       echo Installing master in $MASTER
  1227. --- 223,238 ----
  1228.   
  1229.       if [ -f $MASTER/nnmaster ]
  1230.       then
  1231. !         if [ -f $MASTER/MPID ]
  1232.           then
  1233.               echo "Stopping running master..."
  1234. !             if ./nnmaster -k ; then
  1235. !                 echo "Stopped."
  1236. !             else
  1237. !                 exit 1
  1238. !             fi
  1239.           fi
  1240. !         mv $MASTER/nnmaster $MASTER/nnmaster.old
  1241.       fi
  1242.   
  1243.       echo Installing master in $MASTER
  1244. ***************
  1245. *** 229,235 ****
  1246.           ./inst copy 755 $MASTER $prog
  1247.       done
  1248.   
  1249. !     chmod 4750 $MASTER/nnmaster
  1250.       ;;
  1251.   
  1252.   bin)
  1253. --- 242,248 ----
  1254.           ./inst copy 755 $MASTER $prog
  1255.       done
  1256.   
  1257. !     chmod 6750 $MASTER/nnmaster
  1258.       ;;
  1259.   
  1260.   bin)
  1261. *** ./LAST/man/nn.1.B    Tue May 22 12:53:46 1990
  1262. --- man/nn.1.B    Tue May 29 13:06:43 1990
  1263. ***************
  1264. *** 194,200 ****
  1265.   just \fBreturn\fP to take the default action):
  1266.   .br
  1267.   .sp 0.5v
  1268. !     Action: a)bort e)dit i)spell r)eedit s)end v)iew w)rite  (send)
  1269.   .sp 0.5v
  1270.   .br
  1271.   You now have the opportunity to perform one of the following actions:
  1272. --- 194,202 ----
  1273.   just \fBreturn\fP to take the default action):
  1274.   .br
  1275.   .sp 0.5v
  1276. !     a)bort c)c e)dit i)spell m)ail r)eedit s)end v)iew w)rite
  1277. ! .br
  1278. !     Action: (post article)
  1279.   .sp 0.5v
  1280.   .br
  1281.   You now have the opportunity to perform one of the following actions:
  1282. ***************
  1283. *** 204,213 ****
  1284. --- 206,223 ----
  1285.   .\"ta 4 9
  1286.   \fBa\fP    throw the response away (will ask for confirmation),
  1287.   .br
  1288. + \fBc\fP    mail a copy of a \fIfollow-up\fP to the poster of the article,
  1289. + .br
  1290.   \fBe\fP    edit the file again,
  1291.   .br
  1292.   \fBi\fP    run an (interactive) \fBspell-checker\fP on the text,
  1293.   .br
  1294. + \fBm\fP    mail a (blind) copy to a specified recipient,
  1295. + .br
  1296. + \fBn\fP    same as \fBa\fPbort (\fIno\fP don't post)
  1297. + .br
  1298. + \fBp\fP    post article (same as \fBs\fPend)
  1299. + .br
  1300.   \fBr\fP    throw away the edited text and edit the original text,
  1301.   .br
  1302.   \fBs\fP    send the article or letter,
  1303. ***************
  1304. *** 215,220 ****
  1305. --- 225,232 ----
  1306.   \fBv\fP    view the article (through the \fBpager\fP), or
  1307.   .br
  1308.   \fBw\fP    append it to a file (before you send it).
  1309. + .br
  1310. + \fBy\fP    confirm \fIdefault answer\fP (e.g. \fIyes\fP post it)
  1311.   .in -2m
  1312.   .DT
  1313.   .LP
  1314. *** ./LAST/man/nn.1.C    Tue May 22 12:53:47 1990
  1315. --- man/nn.1.C    Tue May 29 13:06:43 1990
  1316. ***************
  1317. *** 447,452 ****
  1318. --- 447,457 ----
  1319.   completions for the next component
  1320.   when \fInn\fP is prompting for a string, e.g. a file name.
  1321.   .TP
  1322. + \fBignore-xon-xoff\fP        (boolean, default false)
  1323. + Normally, \fInn\fP will ignore ^S and ^Q in the input from the
  1324. + terminal (if they are not handled in the tty driver).  Setting this
  1325. + variable will treat these characters as normal input.
  1326. + .TP
  1327.   \fBinclude-art-id\fP        (boolean, default false)
  1328.   The first line in a response with included material normally reads
  1329.   \&"...somebody... writes:" without a reference to the specific article
  1330. ***************
  1331. *** 763,768 ****
  1332. --- 768,777 ----
  1333.       3:  A single Re: is shown.
  1334.   .fi
  1335.   .TP
  1336. + \fBread-return-next-page\fP    (boolean, default false)
  1337. + When set, the \fBZ\fP {\fBread-return\fP} command will return to the
  1338. + \fInext\fP menu page rather than the current menu page.
  1339. + .TP
  1340.   \fBrecord\fP \fIfile\fP    (string, no default)
  1341.   Setting this
  1342.   .I pseudo
  1343. ***************
  1344. *** 841,846 ****
  1345. --- 850,866 ----
  1346.   When set (in the init file), \fInn\fP will not allow the user to
  1347.   invoke the shell in any way, including saving on pipes.  It also
  1348.   prevents the user from changing certain variables containing commands.
  1349. + .TP
  1350. + \fBshow-purpose-mode\fP \fIN\fP        (integer, default 1)
  1351. + Normally, \fInn\fP will show the purpose of a group the first time it
  1352. + is read, provided a purpose is known.  Setting this variable, this
  1353. + behaviour can be changed as follows:
  1354. + .br
  1355. + .nf
  1356. +     0:  Never show the purpose.
  1357. +     1:  Show the purpose for new groups only.
  1358. +     2:  Show the purpose for all groups.
  1359. + .fi
  1360.   .TP
  1361.   \fBsilent\fP        (boolean, default false)
  1362.   When set, \fInn\fP wont print the logo or "No News" if there are no
  1363. *** ./LAST/man/nnmaster.8    Wed May 16 11:23:52 1990
  1364. --- man/nnmaster.8    Tue May 22 12:15:45 1990
  1365. ***************
  1366. *** 1,4 ****
  1367. ! .TH NNMASTER 1M "Release 6.4"
  1368.   .\" (c) Copyright 1988, 1990, Kim F. Storm.  All rights reserved.
  1369.   .UC 4
  1370.   .SH NAME
  1371. --- 1,4 ----
  1372. ! .TH NNMASTER 8 "Release 6.4"
  1373.   .\" (c) Copyright 1988, 1990, Kim F. Storm.  All rights reserved.
  1374.   .UC 4
  1375.   .SH NAME
  1376. *** ./LAST/master.c    Tue May 22 12:53:51 1990
  1377. --- master.c    Mon May 28 23:35:24 1990
  1378. ***************
  1379. *** 365,372 ****
  1380.       printf("Do you want to repair this file before continuing ? (y)");
  1381.       gets(command);
  1382.       if (s_hangup ||
  1383. !         command[0] == NUL || command[0] == 'y' || command[0] == 'Y')
  1384.           nn_exit(0);
  1385.       }
  1386.   
  1387.       /* if a "GROUPS" file exist offer to use that, else */
  1388. --- 365,375 ----
  1389.       printf("Do you want to repair this file before continuing ? (y)");
  1390.       gets(command);
  1391.       if (s_hangup ||
  1392. !         command[0] == NUL || command[0] == 'y' || command[0] == 'Y') {
  1393. !         printf("Initialization stopped.\n");
  1394. !         printf("Redo ./inst INIT after repairing active file\n");
  1395.           nn_exit(0);
  1396. +     }
  1397.       }
  1398.   
  1399.       /* if a "GROUPS" file exist offer to use that, else */
  1400. ***************
  1401. *** 577,584 ****
  1402.       }
  1403.   
  1404.       if (kill_running) {
  1405. !     for (temp = 10; --temp >= 0; sleep(3))
  1406. !         if (proto_lock(I_AM_MASTER, PL_TERMINATE) < 0) break;
  1407.   
  1408.       if (temp < 0) {
  1409.           printf("The running master will not die....!\n");
  1410. --- 580,590 ----
  1411.       }
  1412.   
  1413.       if (kill_running) {
  1414. !     if (proto_lock(I_AM_MASTER, PL_TERMINATE) < 0)
  1415. !         temp = 0;
  1416. !     else
  1417. !         for (temp = 10; --temp >= 0; sleep(3))
  1418. !         if (proto_lock(I_AM_MASTER, PL_CHECK) < 0) break;
  1419.   
  1420.       if (temp < 0) {
  1421.           printf("The running master will not die....!\n");
  1422. *** ./LAST/menu.c    Tue May 22 12:53:52 1990
  1423. --- menu.c    Mon May 28 23:55:29 1990
  1424. ***************
  1425. *** 27,32 ****
  1426. --- 27,34 ----
  1427.   export int  mark_read_skip = 4; /* effect of X command */
  1428.   export int  mark_read_return = 0; /* effect of Z command */
  1429.   export int  mark_next_group = 0; /* effect of N command */
  1430. + export int  show_purpose_mode = 1; /* 0: never, 1: new, 2: always */
  1431. + export int  read_ret_next_page = 0; /* Z returns to next page */
  1432.   
  1433.   export int  auto_preview_mode = 0; /* preview rather than select */
  1434.   export int  preview_continuation = 12; /* what to do after preview */
  1435. ***************
  1436. *** 76,83 ****
  1437.       so_printf(">");
  1438.       return 1;
  1439.        case 2:
  1440. !     so_printf("%d>", level);
  1441. !     return level < 10 ? 2 : 3;
  1442.        case 3:
  1443.       so_printf("Re: ");
  1444.       return 4;
  1445. --- 78,93 ----
  1446.       so_printf(">");
  1447.       return 1;
  1448.        case 2:
  1449. !     switch (level) {
  1450. !      case 0:
  1451. !         return 0;
  1452. !      case 1:
  1453. !         so_printf(">");
  1454. !         return 1;
  1455. !      default:
  1456. !         so_printf("%d>", level);
  1457. !         return level < 10 ? 2 : 3;
  1458. !     }
  1459.        case 3:
  1460.       so_printf("Re: ");
  1461.       return 4;
  1462. ***************
  1463. *** 422,427 ****
  1464. --- 432,442 ----
  1465.           return cmd;
  1466.   
  1467.            case MC_READGROUP:
  1468. +         for (cur = 0; cur < n_articles; cur++) {
  1469. +             ah = articles[cur];
  1470. +             if (ah->attr == 0 || (ah->attr & A_SELECT))
  1471. +             ah->attr = A_READ;
  1472. +         }
  1473.           return cmd;
  1474.           }
  1475.   
  1476. ***************
  1477. *** 632,639 ****
  1478.             menu_level);
  1479.   
  1480.       purpose[0] = NUL;
  1481. !     if (!merged_menu && current_group->group_flag & G_NEW)
  1482. !     get_purpose(purpose);
  1483.   
  1484.       firsta = 0;
  1485.       while (firsta < n_articles && articles[firsta]->attr == A_SEEN)
  1486. --- 647,658 ----
  1487.             menu_level);
  1488.   
  1489.       purpose[0] = NUL;
  1490. !     if (!merged_menu)
  1491. !     switch (show_purpose_mode) {
  1492. !      case 0: break;
  1493. !      case 1: if ((current_group->group_flag & G_NEW) == 0) break;
  1494. !      case 2: get_purpose(purpose);
  1495. !     }
  1496.   
  1497.       firsta = 0;
  1498.       while (firsta < n_articles && articles[firsta]->attr == A_SEEN)
  1499. ***************
  1500. *** 1046,1052 ****
  1501.        menu_return(ME_NEXT);
  1502.   
  1503.         case K_READ_GROUP_UPDATE:
  1504. !      if (temp = mark_read_skip) break;
  1505.         do_marked_by:
  1506.        temp1 = 0; temp2 = n_articles;
  1507.        switch (temp) {
  1508. --- 1065,1071 ----
  1509.        menu_return(ME_NEXT);
  1510.   
  1511.         case K_READ_GROUP_UPDATE:
  1512. !      if ((temp = mark_read_skip) == 0) break;
  1513.         do_marked_by:
  1514.        temp1 = 0; temp2 = n_articles;
  1515.        switch (temp) {
  1516. ***************
  1517. *** 1519,1525 ****
  1518.       goto redraw;
  1519.   
  1520.        case MC_READGROUP:
  1521. !     if (k_cmd == K_READ_GROUP_THEN_SAME || also_read_articles) goto redraw;
  1522.        case MC_NEXTGROUP:
  1523.       menu_cmd = ME_NEXT;
  1524.       break;
  1525. --- 1538,1549 ----
  1526.       goto redraw;
  1527.   
  1528.        case MC_READGROUP:
  1529. !     if (k_cmd == K_READ_GROUP_THEN_SAME) {
  1530. !         if (read_ret_next_page && nexta < n_articles)
  1531. !         firsta = nexta;
  1532. !         goto redraw;
  1533. !     }
  1534. !     
  1535.        case MC_NEXTGROUP:
  1536.       menu_cmd = ME_NEXT;
  1537.       break;
  1538. *** ./LAST/news.c    Wed May 16 11:22:46 1990
  1539. --- news.c    Fri May 25 13:55:15 1990
  1540. ***************
  1541. *** 55,60 ****
  1542. --- 55,75 ----
  1543.           while (*bp && isascii(*bp) && isspace(*bp) && *bp != NL) bp++;
  1544.           *fptr = bp;
  1545.           }
  1546. + #ifdef NO_HEADER_SEPARATION_HACK
  1547. +         else {
  1548. +         for (cp = bp; *cp && *cp != ':'; cp++) {
  1549. +             if (!isascii(*cp)) break;
  1550. +             if (*cp == '_' || *cp == '-') continue;
  1551. +             if (isalnum(*cp)) continue;
  1552. +             break;
  1553. +         }
  1554. +         if (*cp != ':') {
  1555. +             *bp = NL;
  1556. +             pos--;
  1557. +             continue;
  1558. +         }
  1559. +         }
  1560. + #endif
  1561.   
  1562.       while (*bp && *bp != NL) bp++;
  1563.   
  1564. *** ./LAST/newsrc.c    Tue May 22 12:53:55 1990
  1565. --- newsrc.c    Mon May 28 23:33:28 1990
  1566. ***************
  1567. *** 276,281 ****
  1568. --- 276,282 ----
  1569.       char bak[FILENAME];
  1570.       time_t last_new_group = 0, rc_age, newsrc_age;
  1571.       group_header *last_new_gh = NULL;
  1572. +     extern group_header *lookup_no_alias();
  1573.   
  1574.       if (newsrc_file == NULL)
  1575.       newsrc_file = home_relative(".newsrc");
  1576. ***************
  1577. *** 337,347 ****
  1578.           if (c == RC_UNSUBSCR || c == RC_SUBSCR) {
  1579.           subscr = (c == RC_SUBSCR);
  1580.           *bp = NUL;
  1581. !         gh = lookup(rcbuf);
  1582. !         if (gh == NULL) {
  1583. !             gh = newobj(group_header, 1);
  1584. !             gh->group_name = copy_str(rcbuf); /* invalid group! */
  1585. !         }
  1586.           *bp = c;
  1587.           break;
  1588.           }
  1589. --- 338,344 ----
  1590.           if (c == RC_UNSUBSCR || c == RC_SUBSCR) {
  1591.           subscr = (c == RC_SUBSCR);
  1592.           *bp = NUL;
  1593. !         gh = lookup_no_alias(rcbuf);
  1594.           *bp = c;
  1595.           break;
  1596.           }
  1597. ***************
  1598. *** 353,358 ****
  1599. --- 350,357 ----
  1600.           gh->master_flag |= M_VALID;
  1601.       }
  1602.   
  1603. +     if (gh->master_flag & M_ALIASED) continue;
  1604.       if (rc_seq_tail == NULL)
  1605.           rc_sequence = rc_seq_tail = gh;
  1606.       else {
  1607. ***************
  1608. *** 470,477 ****
  1609.   
  1610.       if (c == NUL) continue;
  1611.       *bp = NUL;
  1612. !     gh = lookup(selbuf);
  1613. !     if (gh == NULL) continue;
  1614.       *bp = c;
  1615.       if (c == SEL_NEW) gh->group_flag |= G_NEW;
  1616.       gh->select_orig = gh->select_line = copy_str(selbuf);
  1617. --- 469,476 ----
  1618.   
  1619.       if (c == NUL) continue;
  1620.       *bp = NUL;
  1621. !     gh = lookup_no_alias(selbuf);
  1622. !     if (gh == NULL || gh->master_flag & M_ALIASED) continue;
  1623.       *bp = c;
  1624.       if (c == SEL_NEW) gh->group_flag |= G_NEW;
  1625.       gh->select_orig = gh->select_line = copy_str(selbuf);
  1626. *** ./LAST/nn.c    Wed May 16 11:23:56 1990
  1627. --- nn.c    Mon May 28 23:34:22 1990
  1628. ***************
  1629. *** 208,214 ****
  1630.       free_memory();
  1631.   
  1632.       if (gh->group_flag & G_FOLDER) {
  1633. !         menu_cmd = folder_menu(gh->group_name);
  1634.           if (menu_cmd == ME_NO_REDRAW) {
  1635.           menu_cmd = ME_NO_ARTICLES;
  1636.           gh->last_db_article = 0;
  1637. --- 208,214 ----
  1638.       free_memory();
  1639.   
  1640.       if (gh->group_flag & G_FOLDER) {
  1641. !         menu_cmd = folder_menu(gh->group_name, 0);
  1642.           if (menu_cmd == ME_NO_REDRAW) {
  1643.           menu_cmd = ME_NO_ARTICLES;
  1644.           gh->last_db_article = 0;
  1645. ***************
  1646. *** 473,479 ****
  1647. --- 473,483 ----
  1648.       ap = args;
  1649.       *ap++ = "nnacct";
  1650.       if (report) *ap++ = "-r";
  1651. + #ifdef STATISTICS
  1652.       sprintf(buf1, "-%c%ld", option, (long)usage_time/60);
  1653. + #else
  1654. +     sprintf(buf1, "-%c0", option);
  1655. + #endif
  1656.       *ap++ = buf1;
  1657.       sprintf(buf2, "-W%d", who_am_i);
  1658.       *ap++ = buf2;
  1659. ***************
  1660. *** 688,694 ****
  1661.       nn_exit(0);
  1662.   
  1663.        case I_AM_CHECK:
  1664. !     visit_init_file(1, (char *)NULL);
  1665.       group_name_args =
  1666.           parse_options(argc, argv, (char *)NULL, check_options,
  1667.                 " [group]...");
  1668. --- 692,698 ----
  1669.       nn_exit(0);
  1670.   
  1671.        case I_AM_CHECK:
  1672. !     visit_init_file(0, (char *)NULL);
  1673.       group_name_args =
  1674.           parse_options(argc, argv, (char *)NULL, check_options,
  1675.                 " [group]...");
  1676. ***************
  1677. *** 699,705 ****
  1678.       break;
  1679.   
  1680.        case I_AM_TIDY:
  1681. !     visit_init_file(1, (char *)NULL);
  1682.       group_name_args = opt_nntidy(argc, argv);
  1683.       break;
  1684.   
  1685. --- 703,709 ----
  1686.       break;
  1687.   
  1688.        case I_AM_TIDY:
  1689. !     visit_init_file(0, (char *)NULL);
  1690.       group_name_args = opt_nntidy(argc, argv);
  1691.       break;
  1692.   
  1693. ***************
  1694. *** 708,714 ****
  1695.       break;
  1696.   
  1697.        case I_AM_GREP:
  1698. !     visit_init_file(1, (char *)NULL);
  1699.       opt_nngrep(argc, argv);
  1700.       silent = 1;
  1701.       break;
  1702. --- 712,718 ----
  1703.       break;
  1704.   
  1705.        case I_AM_GREP:
  1706. !     visit_init_file(0, (char *)NULL);
  1707.       opt_nngrep(argc, argv);
  1708.       silent = 1;
  1709.       break;
  1710. ***************
  1711. *** 802,807 ****
  1712. --- 806,812 ----
  1713.           prompt_line = 2;
  1714.           cmd = goto_group(K_GOTO_GROUP, (article_header *)NULL, setup_access());
  1715.           
  1716. +         if (cmd == ME_NO_REDRAW) sleep(2);
  1717.           } while (repeat_group_query && cmd != ME_QUIT && cmd != ME_NO_REDRAW);
  1718.           clrdisp();
  1719.           unset_raw();
  1720. *** ./LAST/nntp.c    Wed May 16 11:23:57 1990
  1721. --- nntp.c    Mon May 28 23:14:56 1990
  1722. ***************
  1723. *** 28,34 ****
  1724. --- 28,37 ----
  1725.   #include <stdio.h>
  1726.   #include "nntp.h"
  1727.   #include <sys/socket.h>
  1728. + #ifndef EXCELAN
  1729.   #include <netdb.h>
  1730. + #endif
  1731. + #include <errno.h>
  1732.   
  1733.   /* This is necessary due to the definitions in m-XXX.h */
  1734.   #if !defined(NETWORK_DATABASE) || defined(NETWORK_BYTE_ORDER)
  1735. ***************
  1736. *** 35,40 ****
  1737. --- 38,47 ----
  1738.   #include <netinet/in.h>
  1739.   #endif
  1740.   
  1741. + #ifdef EXCELAN
  1742. + #define    IPPORT_NNTP    119
  1743. + #endif
  1744.   import char *db_directory, *tmp_directory, *news_active;
  1745.   
  1746.   export char nntp_server[256];    /* name of nntp server */
  1747. ***************
  1748. *** 50,56 ****
  1749.   
  1750.   import int silent, no_update;
  1751.   
  1752. ! import int errno, sys_nerr;
  1753.   import char *sys_errlist[];
  1754.   extern int user_error();
  1755.   extern int sys_error();
  1756. --- 57,63 ----
  1757.   
  1758.   import int silent, no_update;
  1759.   
  1760. ! import int sys_nerr;
  1761.   import char *sys_errlist[];
  1762.   extern int user_error();
  1763.   extern int sys_error();
  1764. ***************
  1765. *** 70,75 ****
  1766. --- 77,103 ----
  1767.   
  1768.   #define ERR_TIMEOUT    503        /* Response code for timeout */
  1769.   
  1770. + #ifdef NO_BZERO
  1771. + static bzero(p, l)
  1772. + register char *p;
  1773. + register int l;
  1774. + {  
  1775. +     while (l-- > 0)
  1776. +     *p++ = 0;
  1777. + }
  1778. + #endif
  1779. + #ifdef NO_RENAME
  1780. + static rename(old, new)
  1781. + char *old, *new;
  1782. + {
  1783. +     if (unlink(new) < 0 && errno != ENOENT) return -1;
  1784. +     if (link(old, new) < 0) return -1;
  1785. +     return unlink(old);
  1786. + }
  1787. + #endif
  1788.   /*
  1789.    * debug_msg: print a debug message.
  1790.    *
  1791. ***************
  1792. *** 236,243 ****
  1793. --- 264,273 ----
  1794.   {
  1795.       int s;
  1796.       struct sockaddr_in sin;
  1797. + #ifndef EXCELAN
  1798.       struct servent *getservbyname(), *sp;
  1799.       struct hostent *gethostbyname(), *hp;
  1800.   #ifdef h_addr
  1801.       int     x = 0;
  1802.       register char **cp;
  1803. ***************
  1804. *** 253,258 ****
  1805. --- 283,296 ----
  1806.       sin.sin_family = hp->h_addrtype;
  1807.       sin.sin_port = sp->s_port;
  1808.   
  1809. + #else /* EXCELAN */
  1810. +     char *machine;
  1811. +     bzero((char*) &sin, sizeof(sin));
  1812. +     sin.sin_family = AF_INET;
  1813. +     sin.sin_port = htons(0);
  1814. + #endif  /* EXCELAN */
  1815.   #ifdef h_addr
  1816.       /* get a socket and initiate connection -- use multiple addresses */
  1817.   
  1818. ***************
  1819. *** 273,278 ****
  1820. --- 311,333 ----
  1821.       if (x < 0 && who_am_i != I_AM_MASTER)
  1822.       user_error("Giving up on NNTP server %s!\n", nntp_server);
  1823.   #else                    /* no name server */
  1824. + #ifdef EXCELAN
  1825. +     if ((s = socket(SOCK_STREAM, NULL, &sin, SO_KEEPALIVE)) < 0)
  1826. +     sys_error("Can't get NNTP socket: %s", syserr());
  1827. +     sin.sin_port = htons(IPPORT_NNTP);
  1828. +     machine = nntp_server;
  1829. +     if ((sin.sin_addr.s_addr = rhost(&machine)) < 0)
  1830. +         sys_error("%s:  Unknown host.", nntp_server);
  1831. +     /* And then connect */
  1832. +     if (connect(s, &sin) < 0) {
  1833. +     if (who_am_i == I_AM_MASTER)
  1834. +         sys_error("Connecting to %s: %s", nntp_server, syserr());
  1835. +         (void) close(s);
  1836. +     s = -1;
  1837. +     }
  1838. + #else /* not EXCELAN */
  1839.       if ((s = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  1840.       sys_error("Can't get NNTP socket: %s\n", syserr());
  1841.   
  1842. ***************
  1843. *** 283,288 ****
  1844. --- 338,344 ----
  1845.           sys_error("Connecting to %s failed: %s", nntp_server, syserr());
  1846.       s = -1;
  1847.       }
  1848. + #endif  /* EXCELAN */
  1849.   #endif
  1850.       return s;
  1851.   }
  1852. *** ./LAST/patchlevel.h    Tue May 22 12:53:56 1990
  1853. --- patchlevel.h    Mon May 28 23:15:19 1990
  1854. ***************
  1855. *** 14,20 ****
  1856.    *    1990-05-10: Patch #1 (6.4.1) - HIGH
  1857.    *    1990-05-15: Patch #2 (6.4.2) - HIGH
  1858.    *    1990-05-21: Patch #3 (6.4.3) - HIGH
  1859.    */
  1860.   
  1861. ! #define PATCHLEVEL 3
  1862.   
  1863. --- 14,21 ----
  1864.    *    1990-05-10: Patch #1 (6.4.1) - HIGH
  1865.    *    1990-05-15: Patch #2 (6.4.2) - HIGH
  1866.    *    1990-05-21: Patch #3 (6.4.3) - HIGH
  1867. +  *    1990-05-29: Patch #4 (6.4.4) - HIGH
  1868.    */
  1869.   
  1870. ! #define PATCHLEVEL 4
  1871.   
  1872. *** ./LAST/proto.c    Thu Apr 26 16:52:26 1990
  1873. --- proto.c    Mon May 28 20:26:04 1990
  1874. ***************
  1875. *** 119,125 ****
  1876.       return -1;
  1877.   
  1878.       m_pid = open_file(lock, OPEN_CREATE);
  1879. !     if (m_pid == NULL) return 1;    /* failed to lock (permission?) */
  1880.       fprintf(m_pid, "%d\n", process_id);
  1881.       fclose(m_pid);
  1882.   
  1883. --- 119,126 ----
  1884.       return -1;
  1885.   
  1886.       m_pid = open_file(lock, OPEN_CREATE);
  1887. !     if (m_pid == NULL)
  1888. !     sys_error("Cannot create lock file: %s", lock);
  1889.       fprintf(m_pid, "%d\n", process_id);
  1890.       fclose(m_pid);
  1891.   
  1892. *** ./LAST/save.c    Tue May 22 12:53:57 1990
  1893. --- save.c    Mon May 28 23:04:10 1990
  1894. ***************
  1895. *** 383,388 ****
  1896. --- 383,389 ----
  1897.       news_header_buffer hdrbuf;
  1898.       int was_raw = 0, set_visual = 0;
  1899.       char copybuf[FILENAME * 4], uniqbuf[FILENAME];
  1900. +     flag_type st_flag = A_ST_FILED;
  1901.   
  1902.       if (ah->a_group) init_group(ah->a_group);
  1903.   
  1904. ***************
  1905. *** 524,531 ****
  1906.       fclose(art);
  1907.   
  1908.       if (save_mode & DO_UNSHAR) {
  1909. !     if ((c = pclose(save_file)) != 0)
  1910.           sprintf(delayed_msg, "Save command failed; exit = %d", c);
  1911.       save_file = NULL;
  1912.       } else {
  1913.       if (s_pipe)
  1914. --- 525,534 ----
  1915.       fclose(art);
  1916.   
  1917.       if (save_mode & DO_UNSHAR) {
  1918. !     if ((c = pclose(save_file)) != 0) {
  1919.           sprintf(delayed_msg, "Save command failed; exit = %d", c);
  1920. +         st_flag = 0;
  1921. +     }
  1922.       save_file = NULL;
  1923.       } else {
  1924.       if (s_pipe)
  1925. ***************
  1926. *** 537,543 ****
  1927.           "%s: %d lines appended", save_name, lcount);
  1928.   
  1929.       if (s_pipe || (save_mode & SEPARATE_FILES)) {
  1930. !         if (end_save() == 0) return 0;
  1931.       } else
  1932.           save_mode &= ~FILE_IS_NEW;
  1933.       }
  1934. --- 540,546 ----
  1935.           "%s: %d lines appended", save_name, lcount);
  1936.   
  1937.       if (s_pipe || (save_mode & SEPARATE_FILES)) {
  1938. !         if (end_save() == 0) goto err;
  1939.       } else
  1940.           save_mode &= ~FILE_IS_NEW;
  1941.       }
  1942. ***************
  1943. *** 551,564 ****
  1944.       if (set_visual) visual_on();
  1945.       if (was_raw) raw();
  1946.   
  1947. !     ah->flag |= A_ST_FILED;
  1948.   
  1949.       return !s_pipe || (save_mode & SEPARATE_FILES);
  1950.   
  1951.    fatal:
  1952.       if (set_visual) visual_on();
  1953.       if (was_raw) raw();
  1954. -     fclose(art);
  1955.       return 0;
  1956.   }
  1957.   
  1958. --- 554,568 ----
  1959.       if (set_visual) visual_on();
  1960.       if (was_raw) raw();
  1961.   
  1962. !     ah->flag |= st_flag;
  1963.   
  1964.       return !s_pipe || (save_mode & SEPARATE_FILES);
  1965.   
  1966.    fatal:
  1967. +     fclose(art);
  1968. +  err:
  1969.       if (set_visual) visual_on();
  1970.       if (was_raw) raw();
  1971.       return 0;
  1972.   }
  1973.   
  1974. ***************
  1975. *** 578,584 ****
  1976.           return 0;
  1977.           }
  1978.       } else
  1979. !         fclose(sf);
  1980.       }
  1981.   
  1982.       if (save_mode & DO_DECODE) {
  1983. --- 582,591 ----
  1984.           return 0;
  1985.           }
  1986.       } else
  1987. !         if (fclose(sf) == EOF) {
  1988. !         sprintf(delayed_msg, "Save failed (disk full?)");
  1989. !         return 0;
  1990. !         }
  1991.       }
  1992.   
  1993.       if (save_mode & DO_DECODE) {
  1994. *** ./LAST/term.c    Tue May 22 12:53:59 1990
  1995. --- term.c    Mon May 28 20:14:19 1990
  1996. ***************
  1997. *** 17,23 ****
  1998.   #include <sys/ptem.h>
  1999.   #endif
  2000.   
  2001. ! int s_resized;
  2002.   #endif
  2003.   
  2004.   export char *term_name = NULL;
  2005. --- 17,23 ----
  2006.   #include <sys/ptem.h>
  2007.   #endif
  2008.   
  2009. ! extern int s_resized;
  2010.   #endif
  2011.   
  2012.   export char *term_name = NULL;
  2013. ***************
  2014. *** 29,34 ****
  2015. --- 29,35 ----
  2016.   export int  any_message = 0;
  2017.   export int  flow_control = 1;
  2018.   export int  use_visible_bell = 1; /* if supported by terminal */
  2019. + export int  ignore_xon_xoff = 1;
  2020.   
  2021.   export key_type help_key = '?';
  2022.   export key_type comp1_key = SP;
  2023. ***************
  2024. *** 112,117 ****
  2025. --- 113,119 ----
  2026.   
  2027.   extern jmp_buf fake_keyb_sig;
  2028.   extern int arm_fake_keyb_sig;
  2029. + extern char fake_keyb_siglist[];
  2030.   #endif
  2031.   
  2032.   #include <sgtty.h>
  2033. ***************
  2034. *** 216,222 ****
  2035.   
  2036.   #ifdef RESIZING
  2037.   
  2038. ! sig_type catch_winch()
  2039.   {
  2040.       struct winsize winsize;
  2041.   
  2042. --- 218,224 ----
  2043.   
  2044.   #ifdef RESIZING
  2045.   
  2046. ! sig_type catch_winch(n)
  2047.   {
  2048.       struct winsize winsize;
  2049.   
  2050. ***************
  2051. *** 228,233 ****
  2052. --- 230,239 ----
  2053.       s_redraw = 1;
  2054.       s_resized = 1;
  2055.       }
  2056. + #ifdef FAKE_INTERRUPT
  2057. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  2058. +     longjmp(fake_keyb_sig, 1);
  2059. + #endif
  2060.   }
  2061.   #endif /* RESIZING */
  2062.   
  2063. ***************
  2064. *** 244,249 ****
  2065. --- 250,263 ----
  2066.   #endif
  2067.   #endif
  2068.   
  2069. + #ifdef FAKE_INTERRUPT
  2070. + #define SV_INTERRUPT
  2071. + static siginterrupt (signo, on)
  2072. + {
  2073. +     fake_keyb_siglist[signo] = on;
  2074. + }
  2075. + #endif
  2076.   static unsigned sp_table[] = {
  2077.       B9600, 960,
  2078.   #ifdef B19200
  2079. ***************
  2080. *** 326,352 ****
  2081.       get_cap("ce", clr_eol);
  2082.       opt_cap("cd", clr_eos);
  2083.   
  2084. ! #ifdef RESIZING
  2085. !     {
  2086. !     struct winsize winsize;
  2087. !     if (ioctl(0, TIOCGWINSZ, &winsize) >= 0
  2088. !         && winsize.ws_row != 0 && winsize.ws_col != 0) {
  2089. !         Lines = winsize.ws_row;
  2090. !         Columns = winsize.ws_col;
  2091. !         (void) signal(SIGWINCH, catch_winch);
  2092. ! #ifdef SV_INTERRUPT
  2093. !         siginterrupt(SIGWINCH, 1);    /* make read from tty interruptable */
  2094. ! #endif /* SV_INTERRUPT */
  2095. !     }
  2096. !     }
  2097. !     if (Lines == 0 || Columns == 0) {
  2098. ! #endif /* RESIZING */
  2099. !     Lines = tgetnum("li");
  2100. !     Columns = tgetnum("co");
  2101. ! #ifdef RESIZING
  2102. !     }
  2103. ! #endif /* RESIZING */
  2104.   
  2105.       opt_cap("so", enter_standout_mode);
  2106.       opt_cap("se", exit_standout_mode);
  2107. --- 340,347 ----
  2108.       get_cap("ce", clr_eol);
  2109.       opt_cap("cd", clr_eos);
  2110.   
  2111. !     Lines = tgetnum("li");
  2112. !     Columns = tgetnum("co");
  2113.   
  2114.       opt_cap("so", enter_standout_mode);
  2115.       opt_cap("se", exit_standout_mode);
  2116. ***************
  2117. *** 372,377 ****
  2118. --- 367,388 ----
  2119.   
  2120.   #endif /* !USE_TERMINFO */
  2121.   
  2122. + #ifdef RESIZING
  2123. +     {
  2124. +     struct winsize winsize;
  2125. +     if (ioctl(0, TIOCGWINSZ, &winsize) >= 0
  2126. +         && winsize.ws_row != 0 && winsize.ws_col != 0) {
  2127. +         Lines = winsize.ws_row;
  2128. +         Columns = winsize.ws_col;
  2129. +         (void) signal(SIGWINCH, catch_winch);
  2130. + #ifdef SV_INTERRUPT
  2131. +         siginterrupt(SIGWINCH, 1);    /* make read from tty interruptable */
  2132. + #endif /* SV_INTERRUPT */
  2133. +     }
  2134. +     }
  2135. + #endif /* RESIZING */
  2136.       STANDOUT = HAS_CAP(enter_standout_mode);
  2137.       if (STANDOUT) {
  2138.       if (cookie_size < 0) cookie_size = 0;
  2139. ***************
  2140. *** 746,754 ****
  2141.   
  2142.   static int alarm_on = 0;
  2143.   
  2144. ! static mk_timeout()
  2145.   {
  2146.       alarm_on = 0;
  2147.   }
  2148.   
  2149.   #endif
  2150. --- 757,770 ----
  2151.   
  2152.   static int alarm_on = 0;
  2153.   
  2154. ! static mk_timeout(n)
  2155.   {
  2156.       alarm_on = 0;
  2157. + #ifdef FAKE_INTERRUPT
  2158. +     if (fake_keyb_siglist[n] && arm_fake_keyb_sig)
  2159. +     longjmp(fake_keyb_sig, 1);
  2160. + #endif
  2161.   }
  2162.   
  2163.   #endif
  2164. ***************
  2165. *** 821,827 ****
  2166.       c &= 0177;    /* done by ISTRIP on USG systems */
  2167.   #endif
  2168.   
  2169. !     if (c == CONTROL_('Q') || c == CONTROL_('S'))
  2170.           continue;
  2171.   
  2172.       any_multi = 0;
  2173. --- 837,843 ----
  2174.       c &= 0177;    /* done by ISTRIP on USG systems */
  2175.   #endif
  2176.   
  2177. !     if (ignore_xon_xoff && (c == CONTROL_('Q') || c == CONTROL_('S')))
  2178.           continue;
  2179.   
  2180.       any_multi = 0;
  2181. ***************
  2182. *** 861,866 ****
  2183. --- 877,885 ----
  2184.       goto next_key;
  2185.       }
  2186.   
  2187. + #ifdef FAKE_INTERRUPT
  2188. +     arm_fake_keyb_sig = 0;
  2189. + #endif
  2190.   #ifdef CBREAK
  2191.       if (s_redraw) {
  2192.       s_redraw = 0;
  2193. ***************
  2194. *** 869,877 ****
  2195.   #endif
  2196.   
  2197.   #ifndef KEY_BURST
  2198. - #ifdef FAKE_INTERRUPT
  2199. -     arm_fake_keyb_sig = 0;
  2200. - #endif
  2201.       if (n < 0) {
  2202.       if (errno != EINTR) s_hangup++;
  2203.       return K_interrupt;
  2204. --- 888,893 ----
  2205. ***************
  2206. *** 891,896 ****
  2207. --- 907,915 ----
  2208.   #endif
  2209.   
  2210.   got_char:
  2211. + #ifdef FAKE_INTERRUPT
  2212. +     arm_fake_keyb_sig = 0;
  2213. + #endif
  2214.   
  2215.   #ifndef KEY_BURST
  2216.       if (alarm_on) {
  2217. ***************
  2218. *** 1198,1203 ****
  2219. --- 1217,1223 ----
  2220.           in_macro++;
  2221.       break;
  2222.       }
  2223. +     fl;
  2224.   
  2225.       for (;;) {
  2226.       if (!is_raw) {
  2227. *** ./LAST/variable.c    Tue May 22 12:54:00 1990
  2228. --- variable.c    Mon May 28 19:24:01 1990
  2229. ***************
  2230. *** 70,75 ****
  2231. --- 70,76 ----
  2232.       flow_control,
  2233.       flush_typeahead,
  2234.       fmt_rptsubj,
  2235. +     ignore_xon_xoff,
  2236.       include_art_id,
  2237.       include_full_header,
  2238.       keep_rc_backup,
  2239. ***************
  2240. *** 86,91 ****
  2241. --- 87,93 ----
  2242.       query_signature,
  2243.       quick_save,
  2244.       quick_unread_count,
  2245. +     read_ret_next_page,
  2246.       repeat_group_query,
  2247.       report_cost_on_exit,
  2248.       retain_seen_status,
  2249. ***************
  2250. *** 135,140 ****
  2251. --- 137,143 ----
  2252.       response_check_pause,
  2253.       retry_on_error,
  2254.       save_counter_offset,
  2255. +     show_purpose_mode,
  2256.       slow_speed,
  2257.       sort_mode,
  2258.       subject_match_limit,
  2259. ***************
  2260. *** 237,242 ****
  2261. --- 240,246 ----
  2262.       "fsort",            BOOL 2,        (char **)&dont_sort_folders,
  2263.       "header-lines",        STR 0,        (char **)&header_lines,
  2264.       "help-key",            KEY 0,        (char **)&help_key,
  2265. +     "ignore-xon-xoff",        BOOL 0,        (char **)&ignore_xon_xoff,
  2266.       "include-art-id",        BOOL 0,        (char **)&include_art_id,
  2267.       "include-full-header",    BOOL 0,        (char **)&include_full_header,
  2268.       "included-mark",        STR 1,        (char **)included_mark,
  2269. ***************
  2270. *** 285,290 ****
  2271. --- 289,295 ----
  2272.       "quick-count",        BOOL 0,        (char **)&quick_unread_count,
  2273.       "quick-save",        BOOL 0,        (char **)&quick_save,
  2274.       "re-layout",        INT 0,        (char **)&re_layout,
  2275. +     "read-return-next-page",    BOOL 0,        (char **)&read_ret_next_page,
  2276.       "record",            SPEC 1,        (char **)NULL,
  2277.       "repeat",            BOOL 0,        (char **)&fmt_rptsubj,
  2278.       "repeat-group-query",    BOOL 0,        (char **)&repeat_group_query,
  2279. ***************
  2280. *** 301,306 ****
  2281. --- 306,312 ----
  2282.       "select-on-sender",        BOOL 0,        (char **)&select_on_sender,
  2283.       "shell",            STR SAFE 0,    (char **)&user_shell,
  2284.       "shell-restrictions",     BOOL INIT 0,    (char **)&shell_restrictions,
  2285. +     "show-purpose-mode",    INT 0,        (char **)&show_purpose_mode,
  2286.       "silent",            BOOL 0,        (char **)&silent,
  2287.       "slow-mode",        BOOL 0,        (char **)&slow_mode,
  2288.       "slow-speed",        INT 0,        (char **)&slow_speed,
  2289.